LVA Datenbanksysteme (LU 1.0 181.129)
Wintersemester 2005/2006
Gruppe B - Beispiel 2
Auction.com
Lösen Sie die folgenden Probleme mittels SQL:
- Geben Sie pro Kategorie die Anzahl der Dinge sowie die Anzahl der
für sie vorhandenen Bilder aus.
(Achtung: Dinge, von denen es keine Bilder gibt, erhöhen zwar
nicht die Bildanzahl jedoch die Anzahl der Dinge! Vorsicht auch bei
Dingen mit mehreren Bildern!)
- Geben Sie Namen und Login jenes Users aus, der bei einer
Auktion, die meisten Gebote (= die meiste Anzahl) getätigt hat.
-
Geben Sie Namen und Login aller Anbieter aus, deren Status bereits
mindestens 2 Mal geändert wurde und bei denen alle jemals
durchgeführten Statusänderungen von ein und demselben
Mitarbeiter vollzogen wurden.
-
Geben Sie alle Mitarbeiter mit der Anzahl aller von ihnen registrierten
User aus, die entweder als Bieter mind. 2x geboten oder als Anbieter
mind. 2 Auktionen ausgerufen haben.
(Anmerkung: in der Ausgabe sollen auch jene Mitarbeiter aufscheinen,
bei denen diese Anzahl gleich 0 ist!)
-
Geben Sie alle Auktionen aus, bei denen ausschließlich Dinge
versteigert wurden zu denen kein Bild existiert.
-
Geben Sie alle Paare von Bietern, die bei der selben Auktion geboten
haben, gemeinsam mit betreffender Auktionsnummer und der positiven
Differenz ihrer dabei getätigten Höchstgebote aus.
Sortieren Sie die Ausgabe aufsteigend nach Auktionsnummer und
absteigend nach Höhe der Differenz.
(Anmerkung: Achten Sie darauf, dass jedes Paar pro Auktion nur einmal
ausgegeben werden soll!)
Lösen Sie die folgenden Probleme mittels PL/SQL:
(Anmerkung: Verwenden Sie, falls notwendig, die "transaction control"
Befehle COMMIT, ROLLBACK und SAVEPOINT!)
-
Schreiben Sie eine Prozedur, die den Status aller Anbieter ändert,
deren aktueller Status seit dem als Parameter übergebenen Datum
"ermahnt" lautet.
Ändern Sie diesen im Falle eines positiven Kontostands auf
'normal', andernfalls auf 'gesperrt'.
(Anmerkung: d.h. das Datum der letzten Statusänderung eines
"Ermahnten" muss vor dem übergebenen Datum liegen!)
Zusätzlich erwartet die Prozedur als Parameter noch die
Mitarbeiternummer eines Mitarbeiters. Bevor der Status eines Anbieters
geändert und eine Satusänderung eingetragen werden kann, muss
die Prozedur überprüfen ob der Mitarbeiter über
entsprechende Rechte verfügt. Sollte der Mitarbeiter das
notwendige Recht (z.B. 'schreiben') nicht haben, ändern sie die
Textmeldung der von Oracle definierte Exception NO_DATA_FOUND auf:
"Keine entsprechenden Rechte!".
-
a) Schreiben Sie eine Funktion, die als Parameter eine Zahl (entspricht
einem Preis) übergeben bekommt. Je nach Höhe des Preises soll
ein bestimmter Prozentwert returniert werden. Hierfür gelten
folgende Regeln:
- Preis kleiner als 10 --> 2 %
- Preis kleiner als 30 --> 5 %
- Preis kleiner als 100 --> 8 %
- Preis größer oder gleich 100 --> 10 %
b) Schreiben Sie anschließend eine Prozedur, die für alle
beendeten Auktionen einen bestimmten Prozentsatz des aktuellen Gebots
(Anmerkung: das aktuelle Gebot entspricht also dem Verkaufspreis, da
die Auktion ja schon beendet wurde, d.h. ihr Enddatum vor dem aktuellen
liegt!)
berechnet und diesen Betrag vom Kontostand des betroffenen Anbieters
abzieht. Dies betrifft allerdings nur jene Auktionen, deren Attribut
"flag" den Wert "false" haben. Zur Berechnung des Prozentsatzes rufen
Sie die vorher erstellte Funktion auf, wobei sie als Parameter den
Rufpreis der Auktion übergeben.
Setzen sie im Zuge dessen das Attribut "flag" jeder abgerechneten
Auktion auf "true".
-
Schreiben Sie einen Trigger der jedesmal ausgelöst wird, nachdem
ein neues Gebot für eine Auktion eingetragen wurde. Falls die
Auktion noch nicht beendet (EndDatum <= SYSDATE) und das neue Gebot
höher als das aktuelle Gebot der Auktion ist, ändern Sie
dieses dementsprechend und tragen Sie weiters den neuen
Höchstbieter in die DB ein. Ist das Gebot allerdings niedriger,
geben sie lediglich die Meldung "Das Gebot ist zu niedrig!" aus.
Bei Auktionen mit Sofortkauf soll außerdem überprüft
werden, ob das neue Gebot höher als der Sofortkaufpreis ist, dann
soll nämlich das aktuelle Gebot auf den Sofortkaufpreis gesetzt,
der Höchstbieter eingetragen und die Versteigerung beendet werden.
(Anmerkung: Auktionen können frühzeitig abgebrochen werden,
indem einfach das Enddatum auf das aktuelle Datum gesetzt wird!)
(Tipp: erstellen sie am besten eine Prozedur (stored procedure), die
all diese Aufgaben übernimmt und einen Trigger der lediglich diese
Prozedur mit den benötigten Parametern (ID, Login, Gebot)
aufruft!)